package com.hzdaba.aiapi.service.impl;

import com.hzdaba.aiapi.domain.AiCustomer;
import com.hzdaba.aiapi.properties.TokenKeyProperties;
import com.hzdaba.aiapi.service.TokenService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.UUID;
import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.TimeUnit;

@Service
public class RedisTokenServiceImpl implements TokenService {

    /**
     * 访问 Redis
     */
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    /**
     * token key 相关配置
     */
    @Autowired
    private TokenKeyProperties tokenKeyProperties;

    @Override
    public String getToken(AiCustomer aiCustomer) {
        //创建并缓存 token
        //Redis 中的 Hash 数据类型好像无法单独为某个field设置值，纠结了很久，还是用 Hash 吧

        String token = UUID.randomUUID().toString();

        //key为前缀加随机数
        //不加随机数了，要不然每次都要校验很多个对象。当然可以用哈希算法解决这个问题，不过我对位运算不熟
//        int randomNumber = ThreadLocalRandom.current().nextInt(this.tokenKeyProperties.getNumber());
//        String fullNameOfKey = this.tokenKeyProperties.getPrefix() + randomNumber;

        //field为token本身
        //value为用户对象
        this.redisTemplate.opsForHash().put(this.tokenKeyProperties.getPrefix(), token, aiCustomer.getId());

        //设置过期时间
        //每次都设置过期时间好像不合理，应该只有第一个 token 需要设置，弄个定时任务定期删除好了。

        if (ThreadLocalRandom.current().nextInt(100) == 0) {//随机数是0，需要设置过期时间
            this.redisTemplate.expire(this.tokenKeyProperties.getPrefix(), this.tokenKeyProperties.getExpiry(), TimeUnit.MINUTES);
        }

        return token;
    }

}
